#include <stdio.h>
#include "sys/types.h"
#include <unistd.h>

int main(int argc, char const *argv[])
{
    printf("主进程开始执行\n");
    int val=100;
    //fork执行成功会返回两个值，父进程返回子进程的pid，子进程返回0（父进程main,子进程是fork复制的）
    //fork本质上是复制完全相同的内存空间（包括fork前声明的变量）
    //与线程不同，进程之间相互独立，父进程执行完，子进程也不会停止
    //也包含程序计数器pc，指向fork后面的代码，所以子进程fork前的代码无法执行
    //因为内存是复制的，所以相当于两个同名变量，互不不影响，但因为linux系统使用的是虚拟内存，所以两个变量地址相同
    pid_t pid = fork();
    if(pid==-1){
        printf("fork error\n");
        return -1;
    }
    else if(pid==0){
        val++;
        printf("child process,id=%d,val=%d,val地址是%p\n",getpid(),val,&val);
    }
    else{
        //等待子进程结束，父进程才再结束，比较合理
        sleep(1);
        val--;
        printf("parent process,id=%d,val=%d,val地址是%p\n",getpid(),val,&val);
    }
    printf("进程执行结束，俩进程所以会执行两遍\n");
    return 0;
}


